Maven mvnw 脚本
mvnw 脚本
mvnw 是一个 maven wrapper script
,它可以让你在没有安装 maven 或者 maven 版本不兼容的条件下运行 maven 的命令.
注意,需要与 mvnw 软件区分开,spring 项目中的 mvnw 仅仅是个脚本,并非软件。
使用 https://start.spring.io/
生成 Spring Boot 初始项目时,会自动生成这个 mvnw
├── .mvn
│ └── wrapper
│ ├── maven-wrapper.jar
│ └── maven-wrapper.properties
├── mvnw
└── mvnw.cmd
mvnw 全名是 Maven Wrapper,它的原理是在 maven-wrapper.properties
文件中记录你要使用的 Maven 版本,当用户执行 mvnw clean
命令时,发现当前用户的 Maven 版本和期望的版本不一致,那么就下载期望的版本,然后用期望的版本来执行 mvn 命令
为项目添加mvnw支持很简单,有两种方式:
方法一:在Pom.Xml中添加Plugin声明:
<plugin>
<groupId>com.rimerosolutions.maven.plugins</groupId>
<artifactId>wrapper-maven-plugin</artifactId>
<version>0.0.4</version>
</plugin>
这样当我们执行 mvn wrapper:wrapper
时,会帮我们生成 mvnw.bat
、mvnw
、maven/maven-wrapper.jar
、maven/maven-wrapper.properties
这些文件。
然后我们就可以使用 mvnw 代替 mvn 命令执行所有的 maven 命令,比如 mvnw clean package
方法二:直接执行Goal(推荐使用这种)
mvn -N io.takari:maven:wrapper -Dmaven=3.3.3 # 表示我们期望使用的Maven的版本为3.3.3
产生的内容和第一种方式是一样的,只是目录结构不一样,maven-wrapper.jar
和 maven-wrapper.properties
在 ".mvn/wrapper" 目录下
使用的注意事项
1、由于我们使用了新的 Maven ,如果你的 settings.xml 没有放在当前用户下的 .m2 目录下,那么执行 mvnw 时不会去读取你原来的 settings.xml 文件
2、在 mvnw.bat 中有如下的一段脚本:if exist "%M2_HOME%\bin\mvn.cmd" goto init
,意思是如果找到 mvn.cmd
就执行初始化操作,但是 Maven 早期版本不叫 mvn.cmd
,而是叫 mvn.bat
,所以会报 "Error: M2_HOME is set to an invalid directory" 错误,改成你本地的 maven 的匹配后缀就好了。
maven wrapper 根据配置自动切换 maven 版本。这个看起来很有用,但实际上 maven 版本也是很稳定。很少会出现需要切换 maven 版本的情况
使用 mvnw 命令会在直接当前项目下生成 repository,看起来每一个项目独立了repository,很模块化的样子。但是这样不仅浪费了磁盘空间,且实际上开发中并不关心 repository,idea 会自动有 external librayies 目录提供查看依赖的 jar 包。